using System;
using Guids = Red.Scripts.Defines.Guids.Debugger;

namespace Red.Scripts.Debugger.Defines
{
    /// <summary>
    /// Best guess is these are instance IDs, but also used as registry keys
    /// </summary>
    namespace Id
    {
        public static class Raw
        {
            public static string Engine => Guids.Engine.Raw;
            public static string PortSupplier => Guids.PortSupplier.Raw;
        }

        public static class Guid
        {
            public static System.Guid Engine => Guids.Engine.Guid;
            public static System.Guid PortSupplier => Guids.PortSupplier.Guid;
        }
    }

    /// <summary>
    /// Class Id. Added as a class attribute so that the classes can be identified and instantiated
    /// </summary>
    namespace CLSID
    {
        public static class Raw
        {
            public const string Engine = "59E51499-5675-42AA-8079-C00541B6331F";
            public const string ProgramProvider = "716EDBE8-DF0E-4D84-891A-38BFE213728B";
            public const string PortSupplier = "0B101295-917F-4C92-AC9E-C514A224135C";
        }

        public static class Guid
        {
            public static System.Guid Engine => new System.Guid( Raw.Engine );
            public static System.Guid ProgramProvider => new System.Guid( Raw.ProgramProvider );
            public static System.Guid PortSupplier => new System.Guid( Raw.PortSupplier );
        }
    }

    public static class Language
    {
        public static string Name => Scripts.Defines.Guids.Language.Id.Name;
        public static Guid Guid => Scripts.Defines.Guids.Language.Id.Guid;
    }

    // These are well-known guids in AD7. Most of these are used to specify filters in what the debugger UI is requesting.
    // For instance, guidFilterLocals can be passed to IDebugStackFrame2::EnumProperties to specify only locals are requested.
    static class AD7Guids
    {
        static private Guid _guidFilterRegisters = new Guid( "223ae797-bd09-4f28-8241-2763bdc5f713" );
        static public Guid guidFilterRegisters
        {
            get { return _guidFilterRegisters; }
        }

        static private Guid _guidFilterLocals = new Guid( "b200f725-e725-4c53-b36a-1ec27aef12ef" );
        static public Guid guidFilterLocals
        {
            get { return _guidFilterLocals; }
        }

        static private Guid _guidFilterAllLocals = new Guid( "196db21f-5f22-45a9-b5a3-32cddb30db06" );
        static public Guid guidFilterAllLocals
        {
            get { return _guidFilterAllLocals; }
        }

        static private Guid _guidFilterArgs = new Guid( "804bccea-0475-4ae7-8a46-1862688ab863" );
        static public Guid guidFilterArgs
        {
            get { return _guidFilterArgs; }
        }

        static private Guid _guidFilterLocalsPlusArgs = new Guid( "e74721bb-10c0-40f5-807f-920d37f95419" );
        static public Guid guidFilterLocalsPlusArgs
        {
            get { return _guidFilterLocalsPlusArgs; }
        }

        static private Guid _guidFilterAllLocalsPlusArgs = new Guid( "939729a8-4cb0-4647-9831-7ff465240d5f" );
        static public Guid guidFilterAllLocalsPlusArgs
        {
            get { return _guidFilterAllLocalsPlusArgs; }
        }
    }
}
